package com.loong.android.tools;

import java.util.Date;
import java.util.TimerTask;

/**
 * 作者 xili
 * 时间 2022-1-14 05:06:04
 */
public class Timer {
    /**
     * 时钟事件接口
     */
    public abstract static class TimeEvent {
        /**
         * 周期事件回调。注意，该回调函数不是运行在UI线程，若需要更新UI，请使用函数: "更新界面" 或 "runOnUiThread"
         */
        public void onRun() {

        }
    }

    private java.util.Timer mTime;
    private TimerTask mTask;

    /**
     * 返回操作的java.util.Timer对象
     */
    public java.util.Timer getTimer() {
        return mTime;
    }

    /**
     * 返回操作的java.util.TimerTask对象
     */
    public TimerTask getTask() {
        return mTask;
    }

    /**
     * 启动时钟
     * @param delay 延迟启动时间，单位为毫秒
     * @param period 时钟周期时间，单位为毫秒
     * @param callback 时钟周期事件回调
     */
    public Timer start(long delay, long period, TimeEvent callback) {
        close();
        mTime = new java.util.Timer();
        mTask = new TimerTask() {
            @Override
            public void run() {
                if(callback != null) callback.onRun();
            }
        };
        mTime.schedule(mTask, delay, period);
        return this;
    }

    /**
     * 启动时钟
     * @param period 时钟周期时间，单位为毫秒
     * @param callback 时钟周期事件回调
     */
    public Timer start(long period, TimeEvent callback) {
        return start(0, period, callback);
    }

    /**
     * 启动时钟
     * @param firstTime 第一次触发时钟周期事件的时间
     * @param period 时钟周期时间，单位为毫秒
     * @param callback 时钟周期事件回调
     */
    public Timer start(Date firstTime, long period, TimeEvent callback) {
        close();
        mTime = new java.util.Timer();
        mTask = new TimerTask() {
            @Override
            public void run() {
                if(callback != null) callback.onRun();
            }
        };
        mTime.schedule(mTask, firstTime, period);
        return this;
    }

    /**
     * 关闭时钟
     */
    public void close(){
        if(mTask != null){
            mTask.cancel();
            mTask =null;
        }
        if(mTime !=null) {
            mTime.cancel();
            mTime = null;
        }
    }

}
